﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LCTMoodle.Models.ViewModels;
using LCTMoodle.Models.DataModels;
using LCTMoodle.Service;
using LCTMoodle.Helper;

namespace LCTMoodle.Controllers
{
    public class KhoaHocController : Controller
    {
        #region Index
        /// <summary>
        /// Trang index hiển thị, chuyển hướng khi người dùng chưa đăng nhập
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            List<KhoaHocViewModel> khoaHoc;

            //Nếu người dùng có đăng nhập thì lấy khóa học của người dùng
            //Và các khóa học không phải của người dùng
            if (Session["NguoiDung"] != null)
            {
                int maNguoiDung = (Session["NguoiDung"] as NguoiDungViewModel).ma;
                khoaHoc = KhoaHocService.layKhoaHoc_CuaNguoiDung(maNguoiDung);
                khoaHoc.AddRange(KhoaHocService.layKhoaHoc_KhongCuaNguoiDung(maNguoiDung));
            }
            else
            {
                khoaHoc = KhoaHocService.layKhoaHoc();
            }

            if (khoaHoc == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Lấy khóa học thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            return View(khoaHoc);
        }

        /// <summary>
        /// Tìm khóa học (querystring["ThongTin"])
        /// </summary>
        /// <returns></returns>
        public ActionResult TimKhoaHoc()
        {
            List<KhoaHocViewModel> khoaHoc = KhoaHocService.layKhoaHocTheoThongTin_TimKiem(Request.QueryString["ThongTin"]);

            if (khoaHoc == null)
            {
                TempData["ThongBao"] = new string[]
                    {
                        "Tìm khóa học thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            return View("Index", khoaHoc);
        }
        #endregion


        #region Nhóm
        /// <summary>
        /// Nhóm của khóa học
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        /// <returns></returns>
        public ActionResult Nhom(int ma)
        {
            //Lấy khóa học
            KhoaHocViewModel khoaHoc = Service.KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Lấy thông tin khóa học thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            //Mỗi khi load, sẽ cập nhật lại danh sách quyền của người dùng của nhóm đó hoặc tạo mới
            Dictionary<int, string> danhSachQuyen = Session["Quyen"] as Dictionary<int, string>;

            //Nếu đã tồn tại quyền => cập nhật
            if (danhSachQuyen.ContainsKey(ma))
            {
                danhSachQuyen[ma] = QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(ma, (Session["NguoiDung"] != null) ? ((NguoiDungViewModel)Session["NguoiDung"]).ma : -1);
            }
            //Nếu chưa => tạo mới
            else
            {
                danhSachQuyen.Add(ma, QuyenService.layQuyenTheoMaKhoaHocVaMaNguoiDung(ma, (Session["NguoiDung"] != null) ? ((NguoiDungViewModel)Session["NguoiDung"]).ma : -1));
            }

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (danhSachQuyen[ma] == string.Empty)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Lấy quyền thất bại"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            //Nếu người dùng không có quyền vào nhóm => chuyển hướng
            if (danhSachQuyen[ma].IndexOf("|1|") == -1)
            {
                TempData["ThongBao"] =
                    new string[]
                    {
                        "Không có quyền vào nhóm"
                    };
                return RedirectToAction("Index", "TrangChu");
            }

            return View(khoaHoc);
        }
        /// <summary>
        /// Phần view diễn đàn của nhóm
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        /// <returns></returns>
        public JsonResult Nhom_DienDan(int ma)
        {
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                return Json(new
                {
                    trangThai = "Lấy khóa học thất bại (diễn đàn)"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc/Nhom_DienDan.cshtml", khoaHoc)
            });
        }

        /// <summary>
        /// Phần view bài giảng của nhóm
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        /// <returns></returns>
        public JsonResult Nhom_BaiGiang(int ma)
        {
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                return Json(new
                {
                    trangThai = "Lấy khóa học thất bại (bài giảng)"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc/Nhom_BaiGiang.cshtml", khoaHoc)
            });
        }

        /// <summary>
        /// Phần view tài liệu của nhóm
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        /// <returns></returns>
        public JsonResult Nhom_TaiLieu(int ma)
        {
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                return Json(new
                {
                    trangThai = "Lấy khóa học thất bại (tài liệu)"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc/Nhom_TaiLieu.cshtml", khoaHoc)
            });
        }
        /// <summary>
        /// Phần view bài tập của nhóm
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        /// <returns></returns>
        public JsonResult Nhom_BaiTap(int ma)
        {
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                return Json(new
                {
                    trangThai = "Lấy khóa học thất bại (bài tập)"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc/Nhom_BaiTap.cshtml", khoaHoc)
            });
        }
        #endregion

        #region Thêm thành viên
        /// <summary>
        /// View thêm thành viên cho nhóm
        /// </summary>
        /// <param name="ma"></param>
        /// <returns></returns>
        public JsonResult KhungThemThanhVien(int ma)
        {
            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);

            //Kiểm tra nếu lấy dữ liệu thất bại
            if (khoaHoc == null)
            {
                return Json(new
                {
                    trangThai = "Lấy khóa học thất bại"
                });
            }

            return Json(new
            {
                trangThai = "OK",
                ketQua = ControllerHelper.RenderRazorViewToString("~/Views/KhoaHoc/KhungThemThanhVien.cshtml", khoaHoc)
            });
        }
        #endregion

        #region Xử lý khoá học
        /// <summary>
        /// Xử lý xóa khóa học
        /// </summary>
        /// <param name="ma">Mã khóa học</param>
        public ContentResult XuLyXoaKhoaHoc(int ma)
        {
            #region Kiểm tra quyền
            if (!TienIch.daDangNhap())
            {
                return Content("Chưa đăng nhập (Xóa khóa học)");
            }

            KhoaHocViewModel khoaHoc = KhoaHocService.layKhoaHocTheoMaKhoaHoc(ma);
            if (khoaHoc == null)
            {
                return Content("Lấy khóa học thất bại (Xóa khóa học)");
            }
            //Người quản lý hay giảng viên của khóa học?
            if ((Session["NguoiDung"] as NguoiDungViewModel).loaiNguoidung != "QuanLy" &&
                (Session["NguoiDung"] as NguoiDungViewModel).ma != khoaHoc.maGiangVien)
            {
                return Content("Không có quyền xóa khóa học");
            }
            #endregion Kiểm tra quyền

            if (KhoaHocService.xoaKhoaHocTheoMaKhoaHoc(ma))
            {
                return Content("OK");
            }
            return Content("Xóa khóa học thất bại");
        }
        #endregion Xử lý khoá học

        #region Tạo khoá học
        /// <summary>
        /// Tạo khoá học
        /// </summary>
        /// <returns></returns>
        public ActionResult ThemKhoaHoc()
        {
            return View();
        }

        /// <summary>
        /// Xử lý tạo khoá học
        /// </summary>
        /// <param name="form">TenKhoaHoc, GiangVien, MoTa, ChuDe</param>
        public ActionResult XuLyThemKhoaHoc(FormCollection form)
        {
            #region Kiểm tra quyền
            //Kiểm tra người dùng đã đăng nhập hay chưa
            if (!TienIch.daDangNhap())
            {
                //Thông báo lỗi chưa đăng nhập
                TempData["ThongBao"] =
                    new string[] 
                    {
                        "Chưa đăng nhập"                        
                    };
                return RedirectToAction("Index", "TrangChu");
            }
            //Kiểm tra người dùng có quyền tạo khoá học hay không
            switch ((Session["NguoiDung"] as NguoiDungViewModel).loaiNguoidung)
            {
                case "QuanLy":
                case "GiangVien":
                    break;
                default:
                    {
                        //Thông báo lỗi chưa đăng nhập
                        TempData["ThongBao"] =
                            new string[] 
                            {
                                "Không có quyền tạo khoá học"                        
                            };
                        return RedirectToAction("Index", "TrangChu");
                    }
            }
            #endregion Kiểm tra quyền

            #region Kiểm tra thông tin
            //Kiểm tra thông tin form nhập vào
            if (form["TenKhoaHoc"] == "" || form["GiangVien"] == "" || form["MoTa"] == "" || form["ChuDe"] == "")
            {
                //Thông báo lỗi chưa đăng nhập
                TempData["ThongBao"] =
                    new string[] 
                            {
                                "Thông tin nhập vào còn thiếu"                        
                            };
                return RedirectToAction("ThemKhoaHoc", "KhoaHoc");
            }
            #endregion Kiểm tra thông tin

            //Lấy thông tin khóa học
            KhoaHocDataModel khoaHoc = new KhoaHocDataModel();
            khoaHoc.tenKhoaHoc = form["TenKhoaHoc"].ToString();
            khoaHoc.maGiangVien = Convert.ToInt32(form["GiangVien"]);
            khoaHoc.moTa = form["MoTa"].ToString();
            khoaHoc.maChuDe = Convert.ToInt32(form["ChuDe"]);

            //Lưu mã khoá học mới
            int maKhoaHocMoi = KhoaHocService.themKhoaHoc(khoaHoc);

            //Kiểm tra khoá học mới có được tạo hay không
            if (maKhoaHocMoi != 0)
            {
                //Thông báo tạo khoá học thành công
                TempData["ThongBao"] =
                    new string[] 
                    {
                        "Tạo khoá học thành công",
                        "Tot"
                    };
                return RedirectToAction("Index", "KhoaHoc");
            }
            else
            {
                TempData["ThongBao"] =
                    new string[] 
                    {
                        "Tạo khoá học thất bại",
                    };
                return RedirectToAction("Index", "KhoaHoc");
            }
        }
        #endregion Tạo khoá học
    }
}
